package cn.gok.testclass;

import java.lang.reflect.Constructor;
import java.util.Arrays;

/**
 * @Author: chenfan
 * @Description: 通过Class实例 获取对应类的构造器
 */
public class Demo04 {


    public static void main(String[] args)throws Exception {
        Class<?> aClass = Class.forName("cn.gok.entity.Person");

        /*
            在java反射中， 每个构造器都是一个Constructor对象

                    getConstructors()： 获取所有的public构造器
                    getConstructor(Class<?>... parameterType) 获取指定的构造器


                    getDeclaredConstructors():  获取包含private在内的所有构造器
                    getDeclaredConstructors(Class<?>... parameterType) 获取包含private在内的指定构造器

         */
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor.getName());

            //获取参数类型
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));

            System.out.println("=================================================");
        }


        Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.getName());
            Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));
            System.out.println("=================================================");
        }


        /**

         2、通过构造器创建对象：
                    newInstance(Object ... initargs) 创建对象
         */

        Constructor<?> constructor = aClass.getConstructor(int.class, String.class);
        Object o = constructor.newInstance(25, "lisi");
        System.out.println(o);

    }
}
